package main

import (
	"fmt"
	"os"
)

/*
头结点就是加入的第一个节点
*/
//定义猫的结构体结点
type CatNode struct {
	no   int
	name string
	next *CatNode
}

func InsertCatNode(head *CatNode, newCatNode *CatNode) {
	//判断是不是添加第一只猫
	if head.next == nil {
		head.no = newCatNode.no
		head.name = newCatNode.name
		head.next = head //构成一个环形
		fmt.Println("添加成功")
		return
	}
	//定义一个临时变量，帮忙找到环形的最后节点
	temp := head
	for {
		if temp.next == head {
			break
		}
		temp = temp.next
	}
	//加入到链表
	temp.next = newCatNode
	newCatNode.next = head
	fmt.Println("添加成功")
}

//输出这个环形的链表
func ListCircleLink(head *CatNode) {
	temp := head
	if temp.next == nil {
		fmt.Println("空链表")
		return
	}
	for {
		fmt.Printf("猫的信息为=[id=%d name=%s] ->\n", temp.no, temp.name)
		if temp.next == head {
			break
		}
		temp = temp.next
	}
}

//删除
func DelCatNode(head *CatNode, id int) *CatNode {
	temp := head
	helper := head
	//空链表
	if temp.next == nil {
		fmt.Println("空链表")
		return head
	}
	//如果只要一个节点
	if temp.next == head && temp.no == id {
		temp.next = nil
		fmt.Println("删除成功id=", id)
		return head
	}
	//将helper定位到链表最后
	for {
		if helper.next == head {
			break
		}
		helper = helper.next
	}
	//如果有两个包含两个以上节点
	flag := true
	for {
		if temp.next == head { //说明比较到最后一个,最后一个还没比较
			break
		}
		if temp.no == id {
			if temp == head { //说明删除的是头结点
				head = head.next
			}
			helper.next = temp.next
			fmt.Println("删除成功id=", temp.no)
			flag = false
			break
		}
		temp = temp.next     //移动
		helper = helper.next //移动，一旦找到要删除的节点

	}
	//这里还有比较一次
	if flag { //如果flag为真，则在上面没有删除
		if temp.no == id { //最后一个节点就要删除
			helper.next = temp.next
			fmt.Println("删除成功id=", temp.no)
		} else {
			fmt.Println("没有这个id=", id)
		}
	}
	return head
}
func main() {
	//这里初始化一个环形链表的头结点
	head := &CatNode{}
	var key string
	var no int
	var name string
	for {
		fmt.Println("1输入add表示向环形链表添加数据")
		fmt.Println("2输入del表示删除环形链表的数据")
		fmt.Println("3输入show表示显示环形链表")
		fmt.Println("4输入exit退出")
		fmt.Scanln(&key)
		switch key {
		case "add":
			fmt.Println("输入id为：")
			fmt.Scanln(&no)
			fmt.Println("输入猫的名字name=")
			fmt.Scanln(&name)
			cat := &CatNode{
				no:   no,
				name: name,
			}
			InsertCatNode(head, cat)
		case "del":
			fmt.Println("输入要删除的id")
			fmt.Scanln(&no)
			head = DelCatNode(head, no)
		case "show":
			fmt.Println("环形链表如下：")
			ListCircleLink(head)
		case "exit":
			os.Exit(0)
		}
	}
}
